home *** CD-ROM | disk | FTP | other *** search
/ Enter 2004 January / enter-2004-01.iso / files / maxima-5.9.0.exe / {app} / share / maxima / 5.9.0 / src / numerical / slatec / zsqrt.lisp < prev    next >
Encoding:
Text File  |  2003-02-09  |  1.7 KB  |  58 lines

  1. ;;; Compiled by f2cl version 2.0 beta 2002-05-06
  2. ;;; 
  3. ;;; Options: ((:prune-labels nil) (:auto-save t) (:relaxed-array-decls t)
  4. ;;;           (:coerce-assigns :as-needed) (:array-type ':simple-array)
  5. ;;;           (:array-slicing nil) (:declare-common nil)
  6. ;;;           (:float-format double-float))
  7.  
  8. (in-package "SLATEC")
  9.  
  10.  
  11. (let ((drt 0.7071067811865476) (dpi 3.141592653589793))
  12.   (declare (type double-float dpi drt))
  13.   (defun zsqrt (ar ai br bi)
  14.     (declare (type double-float ar ai br bi))
  15.     (prog ((zm 0.0) (dtheta 0.0))
  16.       (declare (type double-float dtheta zm))
  17.       (setf zm (zabs ar ai))
  18.       (setf zm (f2cl-lib:fsqrt zm))
  19.       (if (= ar 0.0) (go label10))
  20.       (if (= ai 0.0) (go label20))
  21.       (setf dtheta (f2cl-lib:datan (/ ai ar)))
  22.       (if (<= dtheta 0.0) (go label40))
  23.       (if (< ar 0.0) (setf dtheta (- dtheta dpi)))
  24.       (go label50)
  25.      label10
  26.       (if (> ai 0.0) (go label60))
  27.       (if (< ai 0.0) (go label70))
  28.       (setf br 0.0)
  29.       (setf bi 0.0)
  30.       (go end_label)
  31.      label20
  32.       (if (> ar 0.0) (go label30))
  33.       (setf br 0.0)
  34.       (setf bi (coerce (f2cl-lib:fsqrt (abs ar)) 'double-float))
  35.       (go end_label)
  36.      label30
  37.       (setf br (f2cl-lib:fsqrt ar))
  38.       (setf bi 0.0)
  39.       (go end_label)
  40.      label40
  41.       (if (< ar 0.0) (setf dtheta (+ dtheta dpi)))
  42.      label50
  43.       (setf dtheta (* dtheta 0.5))
  44.       (setf br (* zm (cos dtheta)))
  45.       (setf bi (* zm (sin dtheta)))
  46.       (go end_label)
  47.      label60
  48.       (setf br (* zm drt))
  49.       (setf bi (* zm drt))
  50.       (go end_label)
  51.      label70
  52.       (setf br (* zm drt))
  53.       (setf bi (* (- zm) drt))
  54.       (go end_label)
  55.      end_label
  56.       (return (values nil nil br bi)))))
  57.  
  58.